/**
 * @file
 */

#ifndef PLIST_H
#define PLIST_H

#include <stdbool.h>

typedef struct plist_s *plist_t;


/*! @file plist.h
 *  @brief < PList maneja un lista simple de doble entrada de punteros
 a elementos de cualquier tipo (void*) >
 */

/**
	@brief Crea una nueva lista.
	@return Nueva lista.
*/
plist_t plist_create(void);

/**
	@brief Elimina una lista, incluyendo los elementos que contenga.
	@param list Lista.
    @pre <code> (list != NULL) </code>
    @pre <code> (*list != NULL) </code>
    @return 0 siempre
*/
int plist_destroy(plist_t *list);

/**
	@brief Añade un elemento en la parte delantera de la lista.
	@param list Lista.
	@param elem Elemento.
    @pre <code> (list != NULL) </code>
    @return True Siempre
*/
bool plist_push(plist_t list, void *elem);

/**
	@brief Quita el primer elemento de la lista.
	@param list Lista.
    @pre <code> (list != NULL) </code>
	@return Elemento.
*/
void* plist_pop(plist_t list);

/**
	@brief Añade un elemento en la parte trasera de la lista.
	@param list Lista.
	@param elem Elemento.
    @pre <code> (list != NULL) </code>
    @return True siempre
*/
bool plist_append(plist_t list, void *elem);

/**
	@brief Quita el ultimo elemento que fue añadido detras de la lista. 
        Siendo una lista simple, solo funciona con el ultimo añadido 
        * (no elimina anteriores).
	@param list Lista.
    @pre <code> (list != NULL) </code>
	@return Elemento.
*/
void* plist_remove_last(plist_t list);

/**
	@brief Verifica si la lista carece de elementos.
	@param list Lista.
    @pre <code> (list != NULL) </code>
    @return True si esta vacia

*/
bool plist_is_empty(plist_t list);

/**
	@brief Hace que la inspeccion apunte al primer elemento de la lista.
	@param list Lista.
    @pre <code> (list != NULL) </code>
*/
void plist_rewind(plist_t list);

/**
	@brief Devuelve el siguiente elemento en la inspeccion de la lista.
	@param list Lista.
	@return Elemento.
*/
void* plist_get_next(plist_t list);

/**
	@brief Devuelve el ultimo elemento de la lista
	@param list Lista.
    @pre <code> (list != NULL) </code>
	@return Elemento.
*/
void* plist_get_last(plist_t list);

#endif
